package com.ljkj.zjf.common;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;


public class DateUtil {

	public static SimpleDateFormat HHmmss = new SimpleDateFormat("HH:mm:ss");
	public static SimpleDateFormat HHmmssNoColon = new SimpleDateFormat("HHmmss");
	public static SimpleDateFormat yyyyMMddHHmmss = new SimpleDateFormat("yyyyMMddHHmmss");

	public static SimpleDateFormat MMddYYYYHHmmss = new SimpleDateFormat("MMddyyyyHHmmss");
	public static SimpleDateFormat MMddHHmmss = new SimpleDateFormat("MMddHHmmss");
	public static SimpleDateFormat yyyyMMdd = new SimpleDateFormat("yyyy-MM-dd");
	public static SimpleDateFormat dd = new SimpleDateFormat("dd");

	public static SimpleDateFormat shortyyyyMMdd = new SimpleDateFormat("yyyyMMdd");

	public static SimpleDateFormat yyyy_MM_dde = new SimpleDateFormat("yyyy-MM-dd E");
	public static SimpleDateFormat yyyyMMddHHmm = new SimpleDateFormat("yyyy-MM-dd HH:mm");
	public static SimpleDateFormat yyyyMMddHHmmYear = new SimpleDateFormat("yyyy年MM月dd日 HH:mm");

	public static SimpleDateFormat yyyy_MM_dd_HHmmss = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	public static SimpleDateFormat HHmm = new SimpleDateFormat("HH:mm");
	public static SimpleDateFormat yyyyMMdd_HHmmss = new SimpleDateFormat("yyyyMMdd_HHmmss");

	public static SimpleDateFormat MMddyyyy = new SimpleDateFormat("MM/dd/yyyy");
	/**
	 *得到格式化后的当前日期
	 *@param simpleDateFormat 格式模式
	 *@return 格式化后的当前日期，如果有异常产生，返回空串""
	 *@see java.util.SimpleDateFormat
	 */
	public static String getCurrentDateTime(SimpleDateFormat simpleDateFormat) {
		String strReturn = "";
		try {
			strReturn=simpleDateFormat.format(new Date());
			return strReturn;
		} catch (Exception e) {
			e.printStackTrace();
			return strReturn;	
		}
	}
	/**
	 *得到格式化后的当前日期
	 *@param formatString 格式模式字符串
	 *@return 格式化后的指定日期，如果有异常产生，返回空串""
	 *@see java.util.SimpleDateFormat
	 */
	public static String getCurrentDateTime(String formatString) {
		String strReturn = "";
		try {
			SimpleDateFormat sdf = new SimpleDateFormat(formatString);
			strReturn= sdf.format(new Date());
			return strReturn;
		} catch (Exception e) {
			e.printStackTrace();
			return strReturn;	
		}
	}
	/**
	 *得到格式化后的指定日期
	 *@param simpleDateFormat 格式模式
	 *@param date 指定的日期值
	 *@return 格式化后的指定日期，如果有异常产生，返回空串""
	 *@see java.util.SimpleDateFormat
	 */
	public static final String getDateTime(Date date,SimpleDateFormat simpleDateFormat) {
		String strReturn = "";
		try {
			strReturn = simpleDateFormat.format(date);
			return strReturn;
		} catch (Exception e) {
			e.printStackTrace();
			return strReturn;
		}
	}
	/**
	 *得到格式化后的指定日期
	 *@param strScheme 格式模式字符串
	 *@param date 指定的日期值
	 *@return 格式化后的指定日期，如果有异常产生，返回空串""
	 *@see java.util.SimpleDateFormat
	 */
	public static final String getDateTime(Date date, String strScheme) {
		String strReturn = "";
		try {
			SimpleDateFormat sdf = new SimpleDateFormat(strScheme);
			strReturn = sdf.format(date);
			return strReturn;
		} catch (Exception e) {
			e.printStackTrace();
			return strReturn;
		}
	}
	/**
	 * 将指定格式化的时间转化为long类型的
	 * 
	 * @param serverTimeString 日期
	 * @param simpleDateFormat 日期格式
	 * @return 如果有异常产生，返回空串""
	 */
	public static long getMillisecondsFromString(String serverTimeString,SimpleDateFormat simpleDateFormat) {
		long millisecond=0;
		try {
			millisecond = simpleDateFormat.parse(serverTimeString).getTime();
			return millisecond;
		} catch (Exception e) {
			e.printStackTrace();
			return millisecond;
		}
	}

	/**
	 * 将毫秒数转化成指定格式类型的日期
	 * @param simpleDateFormat 日期格式
	 * @param milliseconds 日期毫秒
	 * @return 如果有异常产生，返回空串""
	 */
	public static String getStringDateFromMilliseconds(long milliseconds,SimpleDateFormat simpleDateFormat) {
		String string="";
		try {
			Date date = new Date(milliseconds);
			string = simpleDateFormat.format(date);
			return string;
		} catch (Exception e) {
			e.printStackTrace();
			return string;
		}
	}
	/**
	 * 将指定格式化的时间转化为long类型的
	 * 
	 * @param formatString 格式模式字符串
	 * @param simpleDateFormat 日期格式
	 * @return 如果有异常产生，返回空串""
	 */
	public static long getMillisecondsFromString(String serverTimeString,String formatString) {
		long millisecond=0;
		try {
			SimpleDateFormat sdf = new SimpleDateFormat(formatString);
			millisecond = sdf.parse(serverTimeString).getTime();
			return millisecond;
		} catch (Exception e) {
			e.printStackTrace();
			return millisecond;
		}
	}

	/**
	 * 将毫秒数转化成指定格式类型的日期
	 * @param formatString 格式模式字符串
	 * @param milliseconds 日期毫秒
	 * @return 如果有异常产生，返回空串""
	 */
	public static String getStringDateFromMilliseconds(long milliseconds,String formatString) {
		String string="";
		try {
			SimpleDateFormat sdf = new SimpleDateFormat(formatString);
			Date date = new Date(milliseconds);
			string = sdf.format(date);
			return string;
		} catch (Exception e) {
			e.printStackTrace();
			return string;
		}
	}
	/**
	 * 将指定String类型日期转化为Date类型日期
	 * @param strDate 日期
	 * @param formatString 指定日期格式字符串
	 * @return 如果有异常产生，返回null
	 */
	public static final Date convertStringToDate(String strDate,String formatString){
		Date date=null;
		try {
			SimpleDateFormat df = new SimpleDateFormat(formatString);
			date = df.parse(strDate);
			return date;
		} catch (Exception e) {
			e.printStackTrace();
			return date;
		}
	}
	/**
	 * 将指定String类型日期转化为Date类型日期
	 * @param strDate 日期
	 * @param simpleDateFormat 指定日期格式
	 * @return 如果有异常产生，返回null
	 */
	public static final Date convertStringToDate(String strDate, SimpleDateFormat simpleDateFormat){
		Date date=null;
		try {
			date = simpleDateFormat.parse(strDate);
			return date;
		} catch (Exception e) {
			e.printStackTrace();
			return date;
		}
	}
	/**
	 * 获取当前日期
	 * @param timeType 时间类型，譬如：Calendar.DAY_OF_YEAR
	 * @return 日期,如果有异常产生，返回null
	 */
	public static final Date getDateFromNow(int timeType){
		return getDateFromNow(timeType,0);
	}
	/**
	 * 获取日期
	 * @param timeType 时间类型，譬如：Calendar.DAY_OF_YEAR
	 * @param timenum  时间数字，譬如：-1 昨天，0 今天，1 明天
	 * @return 日期,如果有异常产生，返回null
	 */
	public static final Date getDateFromNow(int timeType, int timenum){
		try {
			Calendar cld = Calendar.getInstance();
			cld.set(timeType, cld.get(timeType) + timenum);
			return cld.getTime();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}
	/**
	 * 获取日期
	 * @param timeType 时间类型，譬如：Calendar.DAY_OF_YEAR
	 * @param timenum  时间数字，譬如：-1 昨天，0 今天，1 明天
	 * @param format_string 时间格式，譬如："yyyy-MM-dd HH:mm:ss"
	 * @return 日期字符串,如果有异常产生，返回null
	 */
	public static final String getDateFromNow(int timeType, int timenum, String format_string){
		String string="";
		try {
			Calendar cld = Calendar.getInstance();
			DateFormat df = new SimpleDateFormat(format_string);
			cld.set(timeType, cld.get(timeType) + timenum);
			string= df.format(cld.getTime());
			return string;
		} catch (Exception e) {
			e.printStackTrace();
			return string;
		}
	}
	/**
	 * 获取日期
	 * @param timeType 时间类型，譬如：Calendar.DAY_OF_YEAR
	 * @param timenum  时间数字，譬如：-1 昨天，0 今天，1 明天
	 * @param simpleDateFormat 时间格式，
	 * @return 日期字符串,如果有异常产生，返回null
	 */
	public static final String getDateFromNow(int timeType, int timenum,SimpleDateFormat simpleDateFormat){
		String string="";
		try {
			Calendar cld = Calendar.getInstance();
			cld.set(timeType, cld.get(timeType) + timenum);
			string= simpleDateFormat.format(cld.getTime());
			return string;
		} catch (Exception e) {
			e.printStackTrace();
			return string;
		}
	}

	/**
	 * 指定时间与当前时间对比
	 * @param limitDate 指定时间
	 * @param simpleDateFormat 日期格式
	 * @return 比较结果负数小 0为相等 整数位大,如果有异常产生，返回-1000
	 */
	public static int getDateCompareTime(String limitDate1,String limitDate2,SimpleDateFormat simpleDateFormat){
		int compare=-1000;
		try {
			Date date1 = convertStringToDate(limitDate1,simpleDateFormat);
			Date date2 = convertStringToDate(limitDate2,simpleDateFormat);
			return date1.compareTo(date2);
		} catch (Exception e) {
			e.printStackTrace();
			return compare;
		}
	}
	/**
	 * 指定时间与当前时间对比
	 * @param limitDate 指定时间
	 * @param simpleDateFormat 日期格式
	 * @return 比较结果负数小 0为相等 整数位大,如果有异常产生，返回-1000
	 */
	public static int getDateCompareTime(String limitDate,SimpleDateFormat simpleDateFormat){
		int compare=-1000;
		try {
			Date date = convertStringToDate(limitDate,simpleDateFormat);
			Date nowDate = new Date();
			return date.compareTo(nowDate);
		} catch (Exception e) {
			e.printStackTrace();
			return compare;
		}
	}
	/**
	 * 指定日期与当前日期对比
	 * @param limitDate 指定日期
	 * @return 比较结果负数小 0为相等 整数位大,如果有异常产生，返回-1000
	 */
	public static int getDateCompareDate(String limitDate){
		int compare=-1000;
		try {
			GregorianCalendar calendar = new GregorianCalendar();
			calendar.set(getYear(limitDate),getMonth(limitDate)-1,getDay(limitDate));
			Date date = calendar.getTime();
			Date nowDate = new Date();
			return date.compareTo(nowDate);
		} catch (Exception e) {
			e.printStackTrace();
			return compare;
		}
	}
	/**
	 * 获取指定日期与当前日期的指定时间差
	 * @param limitDate 指定日期
	 * @return 时间差,如果有异常产生，返回-1000
	 */
	public static long getLongCompare(String limitDate,long time,SimpleDateFormat simpleDateFormat){
		int compare=-1000;
		try {
			Date date = convertStringToDate(limitDate,simpleDateFormat);
			long datePP=date.getTime();
			Date nowDate = new Date();
			long dateNow = nowDate.getTime();
			return ((datePP-dateNow)/(time));
		} catch (Exception e) {
			e.printStackTrace();
			return compare;
		}
	}
	/**
	 * 获取指定日期与当前日期的指定时间差
	 * @param limitDate 指定日期
	 * @return 时间差,如果有异常产生，返回-1000
	 */
	public static long getLongCompare(String limitDate,long time){
		int compare=-1000;
		try {
			GregorianCalendar calendar = new GregorianCalendar();
			calendar.set(getYear(limitDate),getMonth(limitDate)-1,getDay(limitDate));
			Date date = calendar.getTime();
			long datePP=date.getTime();
			Date nowDate = new Date();
			long dateNow = nowDate.getTime();
			return ((datePP-dateNow)/(time));
		} catch (Exception e) {
			e.printStackTrace();
			return compare;
		}
	}
	/**
	 * 获取指定日期与当前日期的天数差
	 * @param limitDate 指定日期
	 * @return 天数差,如果有异常产生，返回-1000
	 */
	public static long getLongCompare(String limitDate){
		return getLongCompare(limitDate,24*60*60*1000);
	}
	/**
	 * 获取字符串类型日期的4位年份 格式为yyyy-MM-dd
	 * @param strDate 日期
	 * @return 4位年份,如果有异常产生，返回0
	 */
	public static int getYear(String strDate){
		int iYear=0;//2015-03-15
		try {
			iYear=Integer.parseInt(strDate.substring(0,4));
			return iYear;
		} catch (Exception e) {
			e.printStackTrace();
			return iYear;
		}
	}
	/**
	 * 获取字符串类型日期的2位月份 格式yyyy-MM-dd
	 * @param strDate 日期
	 * @return 2位月份,如果有异常产生，返回0
	 */
	public static int getMonth(String strDate){
		int iMonth=0;
		try {
			iMonth=Integer.parseInt(strDate.substring(5,7));
			return iMonth;
		} catch (Exception e) {
			e.printStackTrace();
			return iMonth;
		}
	}
	/**
	 * 获取字符串类型日期的2位日期 格式yyyy-MM-dd
	 * @param strDate 日期
	 * @return 2位日期,如果有异常产生，返回0
	 */
	public static int getDay(String strDate){
		int iDay=0;
		try {
			iDay=Integer.parseInt(strDate.substring(8,10));
			return iDay;
		} catch (Exception e) {
			e.printStackTrace();
			return iDay;
		}
	}
	/**
	 *String类型日期转化为String类型日期
	 *@param strDate 待转换的日期格式
	 *@return 格式化后的日期，如果有异常产生，返回空串""
	 *@see java.util.SimpleDateFormat
	 */
	public static String StringDateFormat(String strDate,SimpleDateFormat beforSimpleDateFormat,SimpleDateFormat endSimpleDateFormat){
		String string="";
		try {
			string=getDateTime(convertStringToDate(strDate,beforSimpleDateFormat),endSimpleDateFormat);
			return string;
		} catch (Exception e) {
			e.printStackTrace();
			return string;
		}
	}
	public static void addDate() {
		Calendar calendar=new GregorianCalendar(); 
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-yy");
		String dateStr = format.format(calendar.getTime());
		System.out.println("当前日期是 "+dateStr); 
		calendar.add(Calendar.DATE, -30); 
		dateStr = format.format(calendar.getTime());
		System.out.println("三十天前是 "+dateStr); 
	}
	public static void do4(String datestr,int num) {
//	    String pattern = "yyyy-MM-dd";
	    try{
	        Date date1 = yyyy_MM_dd_HHmmss.parse(datestr);
	        long time = date1.getTime()+(1000L * 60 * 60 * 24 * num);           
	        Date date = new Date();
	        if (time > 0) {
	            date.setTime(time);
	        }
	        System.out.println(yyyy_MM_dd_HHmmss.format(date));
	    }catch(Exception e){}
	}
	/**
	 * 计算String类型两日期时间差
	 * @param limitDate
	 * @param limitDate1
	 * @param simpleDateFormat
	 * @return
	 */
	public static String getLongCompareTest(String limitDate,String limitDate1,SimpleDateFormat simpleDateFormat){
		try {
			Date date = convertStringToDate(limitDate,simpleDateFormat);
			Date date1 = convertStringToDate(limitDate1,simpleDateFormat);
			long datePP=date.getTime();
			long datePP1=date1.getTime();
			
			long compare=Math.abs(datePP-datePP1);
			return (compare/1000)/60+"分"+(compare/1000)%60+"秒";
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}
	/**
	 * 获取当前年份
	 * @return
	 */
	public static String getYear(){
		return new Date().getYear()+1900+"";
	}
	public static void main(String[] args){
		SimpleDateFormat yyyyMMddHHmmssSS = new SimpleDateFormat("yyyyMMddHHmmssSSSSSS");
		for(int i=0;i<10;i++){
			System.out.println(i+":"+DateUtil.getCurrentDateTime(yyyyMMddHHmmssSS));
		}
//		System.out.println(getYear());
//		System.out.println("12345678901234".substring(0, 2));
//		System.out.println("12345678901234".substring(2, 8));
//		System.out.println("12345678901234".substring(8, 9));
//		System.out.println(getCurrentDateTime(yyyyMMdd));
//		System.out.println((new Date().getYear()+1900)+"-"+5);
//		String month="5";
//		String yearmonth=(new Date().getYear()+1900)+"-"+month;;
//		if(StringUtil.isNotNull(month)&&month.length()==1){
//			yearmonth=(new Date().getYear()+1900)+"-0"+month;
//		}
//		System.out.println(yearmonth);
//		System.out.println(getCurrentDateTime("yyyy年MM月dd日 HH:mm"));
//
//		System.out.println(getDateTime(new Date(System.currentTimeMillis()),yyyy_MM_dd_HHmmss));
//		System.out.println(getDateTime(new Date(System.currentTimeMillis()),"yyyy年MM月dd日"));
//
//		System.out.println(getMillisecondsFromString("2015-03-15 12:02:50",yyyy_MM_dd_HHmmss));
//		System.out.println(getStringDateFromMilliseconds(1426392170000L,yyyy_MM_dd_HHmmss));
//
//		System.out.println(getMillisecondsFromString("2015-03-15 12:02:50","yyyy-MM-dd HH:mm:ss"));
//		System.out.println(getStringDateFromMilliseconds(1426392170000L,"yyyy-MM-dd HH:mm:ss"));

//		System.out.println(convertStringToDate("","yyyy-MM-dd"));
//		System.out.println(convertStringToDate("2015-03-15 12:02:50",yyyy_MM_dd_HHmmss));
//
//		System.out.println(getDateFromNow(Calendar.DAY_OF_WEEK));
//		System.out.println(getDateFromNow(Calendar.DAY_OF_WEEK,30));
//		System.out.println(getDateFromNow(Calendar.DAY_OF_MONTH,30));
//		System.out.println(getDateFromNow(Calendar.DAY_OF_MONTH,31,"yyyy-MM-dd HH:mm:ss"));
//		System.out.println(getDateFromNow(Calendar.DAY_OF_MONTH,31,yyyy_MM_dd_HHmmss));
//
//		System.out.println(getDateCompareTime("2015-03-18",yyyyMMdd));
//		System.out.println(getDateCompareTime("2015-03-18",yyyyMMdd));
//		System.out.println(getDateCompareDate("2015-03-18"));
//
//		System.out.println(getLongCompare("2015-03-15"));
//		System.out.println(getLongCompare("2015-03-20"));
//		System.out.println(getLongCompare("2015-03-20",60*60*1000));
//		System.out.println(getLongCompare("2015-03-18 19:05:50",60*60*1000,yyyy_MM_dd_HHmmss));
//		System.out.println(isOverdue("2015-03-18 19:05:40"));
//		System.out.println(getLongCompareTest("2015-03-18 19:05:40","2015-03-18 19:06:00",yyyy_MM_dd_HHmmss));

//	addDate();
		 //获取当前月第一天：
//		Date date=convertStringToDate("2015-02","yyyy-MM");
//        Calendar c = Calendar.getInstance();   
//        c.setTime(date);
////        c.add(Calendar.MONTH, 0);
//        c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天 
//        int first = Integer.parseInt(dd.format(c.getTime()));
//        System.out.println("===============first:"+first);
//        
//        //获取当前月最后一天
//        c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));  
//        int last = Integer.parseInt( dd.format(c.getTime()));
//        System.out.println("===============last:"+last);
//        for(int i=first;i<=last;i++){
//        	Date tempDate=convertStringToDate("2015-08-"+i,"yyyy-MM-dd");
//        	Calendar temp = Calendar.getInstance();   
//        	temp.setTime(tempDate);
//            int year = temp.get(Calendar.YEAR);
//    		int month = temp.get(Calendar.MONTH);
//    		int day = temp.get(Calendar.DAY_OF_MONTH);
//        	System.out.println(i+":"+year+month+day+":"+temp.getTimeInMillis());
//        }
//		Date nDate=new Date();
//		System.err.println((nDate.getYear()+1900)+"-"+(nDate.getMonth()+1));
//		
//		Calendar calendar = Calendar.getInstance();
//		int year = calendar.get(Calendar.YEAR);
//		int month = calendar.get(Calendar.MONTH);
//		int day = calendar.get(Calendar.DAY_OF_MONTH);
////		int h = calendar.get(Calendar.HOUR);
////		int m = calendar.get(Calendar.MINUTE);
////		int h = calendar.getTime().getHours();
////		int m = calendar.getTime().getMinutes();
//		int h = calendar.get(Calendar.HOUR_OF_DAY);
//		int m = calendar.get(Calendar.MINUTE);
//		System.out.println(year+":"+month+":"+day+":"+h+":"+m);
//		System.out.println(getDateCompareTime("2015-02-12 19:05:50","2015-02-11 19:05:50",yyyy_MM_dd_HHmmss));
//	do4("2015-04-20 19:05:50",-30);
//	System.out.println("meter_".length());
//	System.out.println("meter_".substring(6));
//	List<String> list=new ArrayList<String>();
//	list.add("1");
//	list.add("2");
//	list.add("3");
//	list.add("4");
//	list.add("5");
//	list.add("6");
//	list.add("7");
////	list.add("8");
//	System.out.println(list);
//	int count=list.size();
//	int start_num=0;
//	while(start_num<count){
//		List<String> list_temp;
//		if((start_num+2)>=count){
//			list_temp=list.subList(start_num, count);
//		}else {
//			list_temp=list.subList(start_num,start_num+2);
//		}
//		start_num=start_num+2;
//		System.out.println(list_temp);
//	}
//	System.out.println(list);
		System.out.println(StringDateFormat("20160731173848",yyyyMMddHHmmss,yyyy_MM_dd_HHmmss));
//		System.out.println(StringDateFormat("2015-02-10 19:05:50.0",yyyy_MM_dd_HHmmss,yyyy_MM_dd_HHmmss));
//		System.out.println(getYear("2015-03-15"));
//		System.out.println(getMonth("2015-03-15"));
//		System.out.println(getDay("2015-03-15"));
	}
}
